上一篇 CPU Scheduling 提到,Scheduler 不一定把所有 Thread 完全平等看待。系統會存在:Priority
High Priority通常更優先取得 CPU
↓
Medium Priority
↓
Low Priority
↓
通常較晚取得 CPU
在RTOS中假設有三條 Thread:
H = High Priority
M = Medium Priority
L = Low Priority
執行優先程度應該是:H -> M -> L
結果卻可能發生一件非常奇怪的事情:H 正在等 L 但 L 又一直被 M 搶走 CPU,M 竟然間接阻止 H 執行,這種優先權關係被「倒過來」的現象,就是:
假設現在有三條 Thread:
H = High Priority
M = Medium Priority
L = Low Priority
以及一把:Mutex X
Step 1:L 先取得 Mutex,一開始 H 和 M 還沒有 Ready
Step 2:H 變成 Ready
突然,高 Priority 的 H 有工作要做,因為:Priority(H) > Priority(L)
在 preemptive priority scheduling 的簡化情況下,Scheduler 可以將 Mutex X 讓給 H。
Step 3:H 開始執行後。結果發現:Mutex X 的 Owner 是 L所以 H:
Running
↓
lock(X)
↓
拿不到
↓
Blocked
這時的關係:
H 等待
↓
L 持有 Mutex
因此,H 能不能繼續,現在取決於 L 什麼時候釋放 Mutex。
H 等 L
↓
那趕快讓 L 跑
↓
L unlock
↓
H 就能繼續
問題是:M 現在 Ready。此時:
H → Blocked
M → Ready
L → Ready
Scheduler 看到的可執行工作只有:M、L,但是 Priority(M) > Priority(L),所以 Scheduler 選:M
結果:CPU -> M Running / L 繼續等 CPU。
M 搶走 L 的 CPU
↓
L 無法繼續 Critical Section
↓
L 無法 unlock(X)
↓
H 繼續等待 X
最後:Medium Priority M竟然間接延遲了High Priority H,這就是 Priority Inversion。